package es.gesfutbol.web;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.criterion.Order;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;

import es.gesfutbol.dao.IArbitreDao;
import es.gesfutbol.domini.implementacio.Arbitre;


//@Component
public class ArbitreController extends MultiActionController{
	
	private IArbitreDao arbitreDao;

	public IArbitreDao getArbitreDao() {
		return arbitreDao;
	}

	public void setArbitreDao(IArbitreDao arbitreDao) {
		this.arbitreDao = arbitreDao;
	}
	
	protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder){
		
		SimpleDateFormat dateFormat = new SimpleDateFormat(); 
		dateFormat.applyPattern("yyyy/MM/dd");  
		dateFormat.setLenient(false);
		binder.registerCustomEditor(Date.class, "naixement", new CustomDateEditor(dateFormat, true));	
	}
	
//	// It will be just called when some validation or binding Exception occurs
//	// Otherwise, Spring will bypass it
	public ModelAndView hanldeBindException(HttpServletRequest request, HttpServletResponse response, ServletRequestBindingException bindingException) {
	    
		BindException bindException = (BindException) bindingException.getRootCause();
		BindingResult bindingResult = (BindingResult) bindException.getModel().get(BindingResult.MODEL_KEY_PREFIX + "command");
		String error2 = bindingResult.getFieldError().getDefaultMessage();
		String code = bindingResult.getFieldError().getCode();
		String campo = bindingResult.getFieldError().getField();
		
		if( (code.equalsIgnoreCase("typemismatch")) && (campo.equals("naixement")) ) {
			error2 = "Formato de fecha incorrecto.<br /><br />Seleccione una fecha válida mediante el calendario";
		}
			
	            return new ModelAndView("administracion/arbitres")
	           .addAllObjects(bindException.getModel())
	           .addObject("error2", error2)
	           .addObject("arbitre",bindingResult.getTarget());
	}
	
	/**
	 * Mètode que inicialitza la pàgina d'arbitres i envia la llista
	 * d'arbitres actuals a la vista.
	 * 
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ModelAndView init(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		//Obtenim la llista d'arbitres per mostrar a la taula.
		List<Arbitre> arbitres = arbitreDao.findAll( Order.asc("nom"));
		//Enviem una instancia d'un arbitre nou.
		Arbitre nouArbitre = new Arbitre();

		ModelMap modelMap = new ModelMap();
		modelMap.addAttribute("llistatArbitres", arbitres);
		modelMap.put("arbitre", nouArbitre);		
		return new ModelAndView("administracion/arbitres", modelMap);
	}

	/**
	 * Mètode que obté de la request l'idArbitre a modificar, el cerca
	 * i retorna els valors al formulari d'arbitres.
	 * 
	 * @param request
	 * @param response
	 * @return
	 */
	public ModelAndView viewUpdate(HttpServletRequest request,
			HttpServletResponse response){

		List<Arbitre> arbitres = arbitreDao.findAll();

		Long idArbitre = Long.parseLong(request.getParameter("idArbitre"));
		Arbitre arbitre = arbitreDao.findById(idArbitre);
		
		ModelMap model = new ModelMap();
		model.addAttribute("llistatArbitres", arbitres);
		model.put("arbitre", arbitre);
		return new ModelAndView("administracion/arbitres", model);
	}

	/**
	 * Mètode que elimina un arbitre de la bbdd.
	 * 
	 * @param request
	 * @param response
	 * @return
	 */
	public ModelAndView delete(HttpServletRequest request,
			HttpServletResponse response){

		Long idArbitre = Long.parseLong(request.getParameter("idArbitre"));
		arbitreDao.delete(idArbitre);

		return new ModelAndView("redirect:init.htm");
	}

	/**
	 * Mètode que guarda els canvis tant de l'afegir com l'editar
	 * arbitre.
	 * 
	 * @param request
	 * @param response
	 * @param equip
	 * @return
	 */
	public ModelAndView addOrUpdate(HttpServletRequest request,
			HttpServletResponse response, Arbitre arbitre){
		
		arbitreDao.save(arbitre);

		return new ModelAndView("redirect:init.htm");
	}



}
